

#ifndef USER_INCLUDE_GPIO_H
#define USER_INCLUDE_GPIO_H

#include "MC3172.h"

#define GPIOA GPIOA_BASE_ADDR
#define GPIOB GPIOB_BASE_ADDR
#define GPIOC GPIOC_BASE_ADDR
#define GPIOD GPIOD_BASE_ADDR

#define GET_PIN_ADR(Pin)  (0x10000<<(Pin))
#define GPIO_SET_PULL_DOWN_VALUE(GPIO_SEL,mask,value)     (*(volatile u32*)(GPIO_SEL+GPIO_PULL_DOWN_ADDR))=(value|mask)

//look https://gitee.com/ShaquilleLiu/mc3172-test/blob/master/USER_CODE/drivers/src/gpio.c
#if 0
#define Get_Pin(gpio_sel,io) ((GPIO_GET_INPUT_VALUE_FAST(gpio_sel) >>(io)) & 0x01)
#else
#define Get_Pin(gpio_sel,io) ((GPIO_GET_INPUT_VALUE_SAFE(gpio_sel) &(GET_PIN_ADR(io)>>16)!=0)?0x01:0x00)
#endif

enum PIN_IN_OUT_MODE
{
    OUTMODE=0,
    INMODE,
    IN_OUT_MODE
};
enum PIN_PULL_MODE
{
    NOT_PULL=0,
    PULL_UP,
    PULL_DOWN
};
/*gpio_sel---GPIOA B  C D
 *gpio_pin--0~15
 *mode  0 outmode  1 inmode
 */
void gpio_pin_init(u32 gpio_sel,u8 gpio_pin,u8 inout_mode,u8 pull_mode);


enum PIN_OUT_VALUE
{
    VALUE_LOW=0,
    VALUE_HIGH,
    VALUE_INV
};
void set_pin_value(u32 gpio_sel, u8 pin,u8 mode);



#endif
